package com.errorfinding.tabbitmqDemo.config;

import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 交换机回调类
 * RabbitTemplate.ConfirmCallback 交换机确认回调方法
 * RabbitTemplate.ReturnsCallback 消息回退接口 可以在当消息传递过程中不可达目的地时将消息返回给生产者
 */
@Component
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback {

    //注入
    @Autowired
    private RabbitTemplate rabbitTemplate;
    //当前类注入到  RabbitTemplate.ConfirmCallback 接口里
    //PostConstruct  后构建
    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnsCallback(this);
    }

    /**
     * 交换机确认回调方法
     * 1.发消息 交换机接收到了 回调
     *   参数1. correlationData 保存回调消息的ID及相关信息
     *   参数2. 交换机收到消息 true
     *   参数3. cause null
     * 2.发消息 交换机接收失败了 回调
     *   参数1. correlationData 保存回调消息的ID及相关信息
     *   参数2. 交换机收到消息 false
     *   参数3. cause 失败原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        String id = correlationData!=null?correlationData.getId(): "";

        if (ack){
            System.out.println("交换机接收成功了,ID为"+id+"的消息");
        }else{
            System.out.println("交换机接收失败了,ID为"+id+"的消息，失败原因："+cause);
        }
    }

    /**
     * 可以在当消息传递过程中不可达目的地时将消息返回给生产者
     * 只有 交换机接收到了 队列接收不到 才进行回退
     */
    @Override
    public void returnedMessage(ReturnedMessage returnedMessage) {
        System.out.println("消息"+new String(returnedMessage.getMessage().getBody())+",被交换机"+returnedMessage.getExchange()+"退回,退回原因："+returnedMessage.getReplyText()+"路由key："+returnedMessage.getRoutingKey());
    }


}
